package homework006;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.Period;
import java.time.format.DateTimeFormatter;
import java.util.Scanner;

/**
 * 需求
 * - 编写一个学生报名类，里面有个submit方法，具体需求如下：
 *   - 键盘录入学生报名信息：包含姓名、年龄、出生年月日（格式为yyyy-DD-mm）和报名时间；
 *     - 其中年龄为18 - 25岁，超出这个范围是异常数据抛出异常；
 *     - 将用户的年龄和出生年月日进行比较，假设年龄为2岁，那么出生年月日就必须是19年；
 *     - 报名时间要求不能晚于当前的时间，如果晚于当前时间则抛出异常；
 *   - 如果以上条件能满足的话，将用户输入的信息赋值到一个Student对象中
 * - 在main方法中调用submit方法，捕获异常，并打印异常信息
 * - 如果没有异常的话，打印Student的完整信息
 */
public class Sign {
    public static Student submit() throws MyScannerException2 {


        // 步骤一：Scanner(System.in)接收输入值
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入姓名");
        String name = sc.nextLine();

        System.out.println("请输入年龄");
        String age = sc.nextLine();

        System.out.println("请输入生日");
        String birthday = sc.nextLine();

        System.out.println("请输入报名时间");
        String signUpTime = sc.nextLine();

        // 步骤二：年龄区间判断
        // 从控制台接收到的数字都是字符串
        // 所以要用Integer.parseInt转一下，然后做比对
        int ageNumber = Integer.parseInt(age);
        if (ageNumber < 18 || ageNumber > 25) {
            throw new MyScannerException2("年龄必须在18-25岁之间");
        }

        // 步骤三：使用LocalDateTime.parse将字符串转LocalDateTime
        LocalDate birthDay = LocalDate.parse(birthday, DateTimeFormatter.ofPattern("yyyy-MM-dd"));

        // 步骤四：获取当前时间
        LocalDateTime now = LocalDateTime.now();

        // 步骤五：使用toLocalDate()方法，转为LocalDate
        // 因为Period类接收的是LocalDate类型
        // 使用between()方法计算当前时间和生日的差值
        int years = Period.between(birthDay, now.toLocalDate()).getYears();

        // 使用getYear方法获取间隔年份

        // 步骤六：将获取到的年份数量与年龄进行比对
        if(years != ageNumber) {
            throw new MyScannerException2("年龄填写错误");
        }


        // 步骤七：用isAfter判断报名
        LocalDateTime signLocalDateTime = localDateTimeTransfer(signUpTime, "yyyy-DD-mm HH:mm:ss");
        if (signLocalDateTime.isAfter(now)) {
            throw new MyScannerException2("报名时间不能晚于当前时间");
        }

        // a 和 b 可以是 LocalDateTime 也可以是 LocalDate
        // a.isBefore(b)  如果 a 的时间早于 b的时间，那么返回true
        // a.isAfter(b)   如果 a 的时间晚于 b的时间，那么返回true


        // 步骤八：组装Student
        Student student = new Student();
        student.setAge(ageNumber);
        student.setBirthday(birthday);
        student.setSignTime(signUpTime);
        student.setName(name);

        return student;
    }

    private static LocalDateTime localDateTimeTransfer(String str, String format) {
        // 定义DateTimeFormatter
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(format);
        // 使用parse转格式
        return LocalDateTime.parse(str, dateTimeFormatter);
    }
}
